#include <my_header.h>

long long current_time_mills()
{
    struct timespec ts;
    // 获取当前时间存入ts结构体
    clock_gettime(CLOCK_REALTIME, &ts);
    // 转换为ns 获取最终秒数需要ms+ns才是完整的时间
    return (long long)ts.tv_sec * 1000000000LL + ts.tv_nsec;
}


/* Usage: ./2_mmap_toupper filename */
int main(int argc, char *argv[]){                                  
    // 记录复制的当前时间
    long t1 = current_time_mills();
    ARGS_CHECK(argc, 2);
    int fd = open(argv[1], O_RDWR);
    ERROR_CHECK(fd, -1, "open");

    // ftruncate调整文件大小为12个字节
    int ret = ftruncate(fd, 12);
    ERROR_CHECK(ret, -1, "ftruncate");

    // open必须以可读可写打开 不然mmap会失败
    char *p = (char *)mmap(NULL, 12, PROT_READ | PROT_WRITE, MAP_SHARED,
                           fd, 0);
    ERROR_CHECK(p, MAP_FAILED, "mmap");

    for(size_t i = 0; i<12; ++i)
    {
        p[i] = toupper(p[i]);
    }
    // 关闭文件映射
    munmap(p, 12);
    // 关闭文件描述符
    close(fd);
    // 复制完成的结束时间
    long t2 = current_time_mills();
    // 打印复制所需要的时间
    printf("time = %ldns\n", (t2 -t1));

    return 0;
}


